05. 合并

注意,主题分支(例如 sidebar )的作用是让你做出不影响 master 分支的更改。当你在主题分支上做出更改后,如果觉得不想要该分支上的更改,则可以删掉该分支,或者你决定要保留更改,则可以将该分支上的更改与其他分支上的更改合并。

将分支组合到一起称为 合并

git 可以自动将不同分支上的更改合并到一起。这种分支和合并功能正是 git 的强大之处!你可以在分支上做出小的或大的更改,然后使用 git 合并这些更改。

我们来看看理论原理。注意 git 中的两种合并:普通 合并 快进合并

Nd016 WebND Ud123 Gitcourse BETAMOJITO L5 71 合并

快速检查

Task Description:

我们快速检查下我们的起点是否一样。请检查以下各项:

Task List:

Task Feedback:

我们开始吧!

⚠️ 了解分支 ⚠️

当你要合并分支时,务必知道当前位于哪个分支上。注意,合并分支会提交 commit。

现在我们不知道如何撤消更改。下节课将介绍这一技巧,但是如果你在错误的分支上进行了合并,可以使用以下命令撤消合并:

git reset --hard HEAD^

(确保包含 ^ 字符!它属于“相对 commit 引用”并表示“父 级 commit”。我们将在下节课学习相对 commit 引用。)

合并指令

git merge 指令用来合并 git 分支:

$ git merge <name-of-branch-to-merge-in>
     

发生合并时,git 将:

  • 查看将合并的分支

  • 查看分支的历史记录并寻找两个分支的 commit 历史记录中都有的单个 commit

  • 将单个分支上更改的代码行合并到一起

  • 提交一个 commit 来记录合并操作

快进合并

在我们的项目中,我们检出了 master 分支,我希望它拥有 footer 分支上的更改。用语言描述的话就是“我想要合并 footer 分支。”。注意表述“合并…”;在进行合并时,另一个分支上的更改将出现在当前检出的分支上。

我再强调下,当我们合并时,我们将其他分支合并到当前(检出的)分支上。我们不是将两个分支合并到一个新的分支上。也不是将当前分支合并到其他分支上。

因为 footer 直接在 master 前面,因此这种合并最简单。将 footer 合并到 master 中将导致 快进合并 (Fast-forward merge)。快进合并将使当前检出的分支向前移动,直到它指向与另一个分支(这里是 footer )指向的 commit 一样为止。

要合并 footer 分支,运行:

$ git merge footer

在运行该命令后,我的终端显示结果如下所示:

_终端显示了将 `footer` 分支合并到 `master` 分支后的结果。_

终端显示了将 footer 分支合并到 master 分支后的结果。

分支位于同一个位置?

再看看仓库,现在你已经将两个分支合并到一起了。 master 分支和 footer 分支指向同一 commit 吗?

SOLUTION:

## 进行普通合并

终于完成快进合并流程了!也没那么难,对吧?

但是你可能会说“当然简单了,所有 commit 都已经在那,分支指针只是向前移动了!”…说的对,这是最简单的合并。

现在我们将进行更常见的合并,其中两个分支完全不一样。你会惊讶地发现,实际合并 sidebar 这样的独特分支,操作是完全一样的!

要合并 sidebar 分支,确保你位于 master 分支上,并运行:

$ git merge sidebar

因为合并的是两个完全不一样的分支,因此将提交 commit。在进行 commit 时,需要提供 commit 消息。因为这是合并 commit,因此已经提供了默认消息。你也可以更改消息,但通常都会直接使用默认的合并 commit 消息。因此当你的代码编辑器打开并包含该消息时,直接关闭编辑器以确认使用该 commit 消息。

在使用默认 commit 消息后,我的终端如下所示:

_终端显示了合并 `sidebar` 分支后的结果。_

终端显示了合并 sidebar 分支后的结果。

就这么多合并操作!很简单吧?你可能读过很多让分支和合并显得非常复杂的文档,但实际上并没有那么难。

哪个分支会移动?

现在做个简短的小练习,看看你是否理解了合并的操作原理。

假设某个仓库有以下 4 个分支:

  • master
  • allisons-mobile-footer-fix
  • nav-updates
  • jonathans-seo-changes

master allisons-mobile-footer-fix 上的更改需要合并到一起。如果 HEAD 指向 allisons-mobile-footer-fix ,在进行合并时,哪个分支将移动?

SOLUTION: allisons-mobile-footer-fix

如果合并失败了呢?

我们刚刚执行的合并能够成功合并。git 能够灵活地合并不同分支上的大量工作。但是,有时候也无法合并分支。如果在进行合并时失败了,则称为 合并冲突(merge conflict) 。我们将在下节课了解合并冲突及其背后的原因,并学习如何解决冲突。

合并小结

总结下, git merge 命令用来在 git 中合并分支:

$ git merge <other-branch>

合并有以下两种类型:

  • 快进合并 – 要合并的分支必须位于检出分支前面。检出分支的指针将向前移动,指向另一分支所指向的同一 commit。

  • 普通类型的合并

    • 两个完全不同的分支被合并
    • 创建一个合并 commit

    深入研究

  • 分支合并: | git 图书

  • git-merge git 文档 ( )

  • git 合并 Atlassian 博客 ( )